/*
 * node.h
 *
 *  Created on: Nov 28, 2010
 *      Author: cumeo89
 */

#ifndef NODE_H_
#define NODE_H_

#include "edge.h"
#include "util.h"
#include <glib.h>

struct SEdge;
struct SNode;

/**
 * Chứa dữ liệu về một nút trong cây hậu tố.
 */
typedef struct SNode {

	/**
	 * Giá trị C(v) của nút, được sử dụng khi tìm xâu con chung.
	 */
	int _c;

	/**
	 * Cạnh nối từ nút cha đến nút này.
	 */
	struct SEdge *parentEdge;

	/**
	 * Liên kết hậu tố.
	 */
	struct SNode *link;

	/**
	 * Danh sách các cạnh đến nút con.
	 */
	GSList *edges;

} Node;

/**
 * Tạo nút mới, nút được tạo cần được giải phóng bằng hàm n_free
 * @return con trỏ đến nút mới
 * @see n_free()
 */
Node *n_new();

/**
 * Giải phóng bộ nhớ của nút và các nút con cháu của nó.
 */
void n_free(Node *node);

/**
 * Trả về cạnh từ nút cha đến node.
 * @return con trỏ đến cạnh
 */
struct SEdge *n_getParentEdge(Node *node);

/**
 * Trả về nút cha của node.
 * @return con trỏ đến nút cha
 */
Node *n_getParent(Node *node);

/**
 * Nối một cạnh với node, nút ở đầu kia của cạnh trở thành
 * nút con của node.
 */
void n_addEdge(Node *node, struct SEdge *edge);

/**
 * Get the edge starting with character c,
 * return NULL if no edge found.
 */
struct SEdge *n_getEdge(Node *node, gunichar c, Ucs4String **stringArr);

/**
 * Xoá một cạnh khỏi node, nút nối với đầu kia của cạnh được tự do
 */
void n_removeEdge(Node *node, struct SEdge *edge);

/**
 * Xác định một nút có phải lá hay không.
 * @return TRUE nếu nút là lá, FALSE nếu ngược lại.
 */
gboolean n_isLeaf(Node *node);

#endif /* NODE_H_ */
